package com.itlong.cloud.operate.dao;

import com.itlong.cloud.POJO.VO.app.robot.AppProjectRobotInfoVO;
import com.itlong.cloud.POJO.PO.PropertyRoleFunctionPO;
import com.itlong.cloud.POJO.PO.PropertyRoleProjectPO;
import com.itlong.cloud.POJO.PO.PropertyUserInfoPO;
import com.itlong.cloud.POJO.VO.operate.OperatePropertyAccountDetailVO;
import com.itlong.cloud.POJO.VO.operate.OperatePropertyAccountVO;
import com.itlong.cloud.POJO.VO.operate.OperatePropertyDeveloperVO;
import com.itlong.cloud.POJO.VO.operate.OperatePropertyRoleVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      物业账号数据访问接口
 * </desc>
 *
 * @createDate 2017-10-25.
 */
@Mapper
@Repository
public interface IOperatePropertyAccountDao extends IAbstractBaseDao<PropertyUserInfoPO>{


    /**
     * <desc>
     *      获取物业账号角色类型列表
     * <desc/>
     *
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-27
     */
    List<OperatePropertyRoleVO> getPropertyRoles();

    /**
     * <desc>
     *      判断账号名是否已存在
     * <desc/>
     *
     * @param userName 账号名
     * @return 同名账号个数
     * @author Chunjian.G
     * @createDate 2017-10-25
     */
    Integer checkUserName(@Param("userName") String userName);

    /**
     * <desc>
     *      判断某项目某角色用户是否已存在（一个项目的一个角色，只能有一个用户）
     * <desc/>
     *
     * @param projectId 项目编号
     * @param roleId 角色id
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-31
     */
    Integer checkProjectRoleExist(@Param("projectId") String projectId,
                                  @Param("roleId") String roleId,
                                  @Param("userId") String propertyUserId);


    /**
     * <desc>
     *      添加物业账号
     * <desc/>
     *
     * @param params 保存参数
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-25
     */
    Integer save(Map<String, Object> params);

    /**
     * <desc>
     *      保存物业_角色_项目关联
     * <desc/>
     *
     * @param roleProjectPOS 物业_角色_项目关联
     * @return 
     * @author Chunjian.G
     * @createDate 2017-10-25
     */
    Integer saveRoleProject(List<PropertyRoleProjectPO> roleProjectPOS);

    /**
     * <desc>
     *      保存角色_项目_资源关联
     * <desc/>
     *
     * @param roleFunctionPOS 角色_项目_资源关联
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-26
     */
    Integer saveRoleProjectFunction(List<PropertyRoleFunctionPO> roleFunctionPOS);
    
    /**
     * <desc>
     *      更新单个物业账号
     * <desc/>
     *
     * @param params 更新参数
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-25
     */
    Integer update(Map<String, Object> params);

    /**
     * <desc>
     *      分页获取物业账号简易信息列表
     * <desc/>
     *
     * @param params 查询参数
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-25
     */
    List<OperatePropertyAccountVO> getSimplePage(Map<String, Object> params);

    /**
     * <desc>
     *      获取记录数
     * <desc/>
     *
     * @param params 查询参数
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-25
     */
    Integer getCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取单个账户详情
     * <desc/>
     *
     * @param userId 账户id
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-26
     */
    OperatePropertyAccountDetailVO getDetail(@Param("userId") String userId);

    /**
     * <desc>
     *      获取单个账户详情
     * <desc/>
     *
     * @param userId 账户id
     * @param roleId 角色id
     * @return
     * @author Qiang.S
     * @createDate 2018-12-28
     */
    List<PropertyRoleProjectPO> getPropertyRoleProjectInfo(@Param("userId") String userId, @Param("roleId") String roleId);

    /**
     * <desc>
     *      获取单个物业账号 关联的项目列表
     * <desc/>
     *
     * @param userId 用户id
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-26
     */
    List<PropertyRoleProjectPO> getManageProjectIds(@Param("userId") String userId);

    /**
     * <desc>
     *      批量删除物业账号
     * <desc/>
     *
     * @param userIds 物业账号id列表
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-27
     */
    Integer removePropertyUsers(@Param("userIds") String[] userIds);

    /**
     * <desc>
     *      删除角色-项目关系
     * <desc/>
     *
     * @param userId
     * @param roleId
     * @param projectIds
     * @return
     * @author Chunjian.G
     * @createDate 2018-01-09
     */
    Integer removeRoleProject(@Param("userId") String userId, @Param("roleId") String roleId,
                              @Param("projectIds") List<String> projectIds);

    /**
     * <desc>
     *      删除对应角色-对应项目与资源的关联
     * <desc/>
     *
     * @param roleId 角色
     * @param projectIds 项目列表
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-26
     */
    Integer removeRoleProjectFunction(@Param("roleId") String roleId,
                                      @Param("projectIds") List<String> projectIds);

    /**
     * <desc>
     *      根据id删除记录
     * <desc/>
     *
     * @param ids 记录id列表
     * @return
     * @author Chunjian.G
     * @createDate 2018-01-12
     */
    Integer removeRoleProjectByIds(@Param("ids") List<Integer> ids);
    /**
     * <desc>
     *      根据id删除记录
     * <desc/>
     *
     * @param ids 记录id列表
     * @return
     * @author Chunjian.G
     * @createDate 2018-01-12
     */
    Integer removeRoleProjectFunctionByIds(@Param("ids") List<Integer> ids);

    /**
     * <desc>
     *      批量重置物业账号密码
     * <desc/>
     *
     * @param
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-27
     */
    Integer resetPassword(
            @Param("userIds") String[] userIds,
            @Param("password")String password);

    /**
     * <desc>
     *      判断某项目的某个物业账号角色是否已分配权限
     * <desc/>
     *
     * @param projectId
     * @param roleId
     * @return
     * @author Chunjian.G
     * @createDate 2018-01-18
     */
    Integer checkRoleFunctionExist(@Param("projectId") String projectId, @Param("roleId")String roleId);
    
    /**
     * <desc>
     *      判断项目角色是否已分配权限
     * <desc/>
     *
     * @param projectIds
     * @return 
     * @author Chunjian.G
     * @createDate 2018-01-19
     */
    List<PropertyRoleFunctionPO> checkRoleProjectFunction(@Param("projectIds") List<String> projectIds);

    /**
     * <desc>
     *      分页获取物业开发者信息列表
     * <desc/>
     *
     * @param params 查询参数
     * @return
     * @author Qiang.S
     * @createDate 2018-06-29
     */
    List<OperatePropertyDeveloperVO> getDeveloperPage(Map<String, Object> params);

    /**
     * <desc>
     *      获取开发者记录数
     * <desc/>
     *
     * @param params 查询参数
     * @return
     * @author Qiang.S
     * @createDate 2018-06-29
     */
    Integer getDeveloperCount(Map<String, Object> params);

    /**
     * <desc>
     *      根据项目编号获取userId
     * <desc/>
     *
     * @param projectIdArr 项目编号,多个以逗号隔开
     * @return
     * @author Juguang.S
     * @createDate 2018-08-21
     */
    List<String> getUserIdByProjectId(@Param("projectIdArr") List<String> projectIdArr);

    /**
     * <desc>
     *      根据userId修改物业账号中的物业名称
     * <desc/>
     *
     * @param userIdList 记录id列表
     * @return
     * @author Juguang.S
     * @createDate 2018-08-22
     */
    void updatePropertyNameByUserId(@Param("userIdList") List<String> userIdList,@Param("propertyName") String propertyName);

    /**
     * <desc>
     *      删除开发者关联项目
     * <desc/>
     *
     * @param userId 物业账号id列表
     * @return
     * @author Qiang.S
     * @createDate 2018-09-07
     */
    Integer removePropertyDeveloper(@Param("userId") String userId);

    /**
     * <desc>
     *      删除开发者关联功能权限
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Qiang.S
     * @createDate 2018-09-07
     */
    Integer removeDeveloperRoleProjectFunction(@Param("projectId") String projectId);

    /**
     * <desc>
     *      查询开发者牌照信息
     * </desc>
     *
     * @param userId 用户id
     * @return 开发者牌照信息
     * @author wangzhi
     * @createDate 2019/07/03
     */
    Map<String,Object> getLicenceInfo(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      删除物业用户的套餐
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/16
     */
    Integer deletePropertyUserPackage(@Param("userId") String userId);

    /**
     * <desc>
     *      套餐分配用户
     * </desc>
     *
     * @param propertyPackageIds 套餐id数组
     * @param userId 要分配的用户id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/3/26
     */
    Integer allotPackageUser(@Param("propertyPackageIds") String[] propertyPackageIds,
                             @Param("userId") String userId,
                             @Param("status") Integer status,
                             @Param("createTime") Date createTime);

    /**
     * <desc>
     *      获取项目及项目下的机器人id列表
     * </desc>
     *
     * @param params 参数map
     * @return 项目及项目下的机器人id列表
     * @Author Zhu.yj
     * @createDate  2020/8/25
     */
    List<AppProjectRobotInfoVO> getProjectRobotInfoByDeveloper(Map<String, Object> params);

    /**
     * <desc>
     *      获取工程人员项目
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/8/25
     */
    List<String> getEngineerProjectIds(@Param("userId") String userId);

    /**
     * <desc>
     *      获取默认套餐
     * </desc>
     *
     * @param
     * @return 默认套餐id
     * @Author Zhu.yj
     * @createDate  2020/9/17
     */
    String getDefaultPackage(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取菜单
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/17
     */
    List<String> getFunctionIds(@Param("propertyPackageId") String propertyPackageId);

    
    /**
    *<desc>
    * 根据项目id修改线下平台开发者 中licence的
    *</desc>
    *
    * @Author  chengshican
    * @Date   2020-09-21 15:48
    * @Param  
    * @Return      
    * @Exception   
    * 
    */
   int updateProjectInfoLicenceByProjectId(@Param("projectId") String projectId,@Param("licence") String licence,@Param("userId") String userId,@Param("roleId") String roleId );

   /**
    * <desc>
    *       获取绑定了套餐的用户id列表
    * </desc>
    *
    * @return
    * @Author Zhu.yj
    * @createDate  2020/10/16
    */
   List<String> getUserIdList();

   /**
    * <desc>
    *       获取物业管理员和集团物业管理员列表
    * </desc>
    *
    * @param params 参数map
    * @return 物业管理员和集团物业管理员列表
    * @Author Zhu.yj
    * @createDate  2020/10/22
    */
   List<OperatePropertyAccountVO> getAdminPage(Map<String, Object> params);

    /**
     * <desc>
     *       获取物业管理员和集团物业管理员列表数量
     * </desc>
     *
     * @param params 参数map
     * @return 物业管理员和集团物业管理员列表总数量
     * @Author Zhu.yj
     * @createDate  2020/10/22
     */
    Integer getAdminPageCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取有集团物业管理员管辖的项目列表
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2021/5/21
     */
    List<String> getGroupAdminProjectList();

}
